/*
 * @lc app=leetcode.cn id=3 lang=cpp
 *
 * [3] 无重复字符的最长子串
 *
 * https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/
 *
 * algorithms
 * Medium (38.99%)
 * Likes:    8085
 * Dislikes: 0
 * Total Accepted:    2M
 * Total Submissions: 5M
 * Testcase Example:  '"abcabcbb"'
 *
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 * 
 * 
 * 
 * 示例 1:
 * 
 * 
 * 输入: s = "abcabcbb"
 * 输出: 3 
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 
 * 
 * 示例 2:
 * 
 * 
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 * 
 * 
 * 示例 3:
 * 
 * 
 * 输入: s = "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
 * 请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 0 <= s.length <= 5 * 10^4
 * s 由英文字母、数字、符号和空格组成
 * 
 * 
 */

// @lc code=start
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 0, right = -1, len = 0, maxLen = 0;
        unordered_set<char> st;
        while(++right < s.size()) {
            if(st.find(s[right]) == st.end()) {
                st.insert(s[right]);
                // right++;
                len = right - left + 1;
                maxLen = len > maxLen ? len : maxLen;
            } else {
                // 在left向右移动的同时，及时的把负责统计的set中的数据踢出去
                while(s[left] != s[right]) st.erase(s[left++]);
                left++;
            }

        }
        cout<<"left = "<<left<<" right = "<<right<<endl;
        return maxLen;
    }
};
// @lc code=end

